package com.caiwm.client.protocol;

import com.caiwm.client.common.ClientConfig;
import com.caiwm.client.common.MessageEntity;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * <pre>
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃  神兽保佑
 * 　　　　┃　　　┃  代码无bug
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━感觉萌萌哒━━━━━━
 * </pre>
 *
 * @author shiqla
 * @Desc ${DESC}
 * @Date 2019/1/11/011
 */
public class TCPUtils {

    private static TCPUtils instance;

    private Socket socket;

    private ObjectMapper objectMapper;

    private ConcurrentLinkedQueue<MessageEntity> linkedQueue;

    private TCPUtils(){

        objectMapper = new ObjectMapper();
        this.linkedQueue = new ConcurrentLinkedQueue<MessageEntity>();
    }

    public static TCPUtils getInstance(){
        if(instance == null){
            synchronized (TCPUtils.class){
                if(instance == null){
                    instance = new TCPUtils();
                }
            }
        }
        return instance;
    }

    public boolean connector(){
       try {

           this.socket = new Socket(ClientConfig.SERVER_IP,ClientConfig.SERVER_PORT);
//           this.socket.setSoTimeout(ClientConfig.TIEM_OUT);

           return true;

       }catch (Exception e){
           e.printStackTrace();
           return false;
       }
    }

    public Socket getSocket(){
        return this.socket;
    }

    public void sendMessage(MessageEntity messageEntity){

        try {
            String message = this.objectMapper.writeValueAsString(messageEntity);
            this.socket.getOutputStream().write(message.getBytes("utf-8"));
            this.socket.getOutputStream().flush();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public MessageEntity reivceMessage(){
        //最大接受10KB的数据
        byte[] bytes = new byte[10240];
        try {
            this.socket.getInputStream().read(bytes);
            MessageEntity messageEntity = this.objectMapper.readValue(bytes,MessageEntity.class);
            System.out.println("客户端收到服务器推送消息：" + messageEntity.toString());
            return messageEntity;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public Queue getLinkQueue(){
        return this.linkedQueue;
    }

}
